package shiyl.use.springboot.requestparam.controller;

import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.Date;

/**
 * <pre>
 * <code>@RequestBody</code>可以将请求体中的JSON字符串绑定到相应的bean上，当然，也可以将其分别绑定到对应的字符串上。
 * 在GET请求中，不能使用<code>@RequestBody</code>。
 * </pre>
 * @author shiyl
 */
@Slf4j
@RestController
@RequestMapping("/requestbody")
public class RequestBodyDemoController {

    /**
     * 一个配合Demo的类，包括类各种类型的属性，用来演示<code>@RequestBody</code>时，如何传递各种类型的参数
     */
    @Data
    @ToString
    public static class User{
        private String name ;
        private int age ;
        /**
         * 日期类型
         * 演示：SpringMvc中日期和String之间序列化和反序列化
         * 希望以"YYYY-MM-DD HH:mm:ss:SSS"，具有高可读性，且也能在日期和String之间序列化和反序列化
         */
        private Date retTime ;
        /**
         * 日期类型
         * 简单的格式"YYYY-MM-DD"
         */
        private Date birthDay ;
    }

    /**
     * <code>@PostMapping</code>规定使用POST请求
     * <code>@ResponseBody</code>表示该方法的返回的结果直接写入 HTTP 响应正文（ResponseBody）中，一般在异步获取数据时使用，通常是在使用 @RequestMapping 后，返回值通常解析为跳转路径，加上 @Responsebody 后返回结果不会被解析为跳转路径，而是直接写入HTTP 响应正文中。
     * <code>@RequestBody</code>接收请求json数据为一个字符串content（可转为json对象进行解析）
     *
     * @param content
     * @return
     */
    //@RequestMapping("/demo1") //效果同 PostMapping
    @PostMapping("/demo1")
    @ResponseBody
    public User demo1(@RequestBody String content){

        log.info("receive content: "+content);

        User u = new User() ;
        u.setName(content);
        return u ;
    }

    /**
     * 接收请求数据，并转为一个对象，对象属性名称必须与json的key相同
     * @param user
     * @return
     */
    @PostMapping("/demo2")
    public User demo2(@RequestBody User user){

        User u = new User() ;
        u.setName(user.getName());
        u.setAge(user.getAge());
        return u ;
    }
}
